﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Markup;
using System.Windows.Resources;
using System.Windows.Media.Imaging;

namespace TTApp.Phone.Silverlight.Hexagons
{
    /// <summary>
    /// Hình trang trí cho nền của HexagonSlot.
    /// </summary>
    [ContentProperty("")]
    public partial class BackgroundDecoration : Decoration
    {
        #region //----------------------------- Class Private Fields --------------------------------------//
        /// <summary>
        /// List chứa các image nằm trong Decoration này.
        /// </summary>
        private List<Image> _imageList = new List<Image>();
        #endregion

        #region //----------------------------- Class Public Constructors ---------------------------------//
        /// <summary>
        /// Khởi tạo 1 đối tượng BackgroundDecoration mới.
        /// </summary>
        public BackgroundDecoration()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(OnLoaded);
        }

        /// <summary>
        /// Khởi tạo 1 đối tượng BackgroundDecoration mới với tên được truyền vào.
        /// </summary>
        /// <param name="decorationName">Tên của Decoration.</param>
        public BackgroundDecoration(string decorationName) :
            base(decorationName)
        {
            InitializeComponent();
            Loaded +=new RoutedEventHandler(OnLoaded);
        }
        #endregion

        #region //----------------------------- Class CLR Properties --------------------------------------//
        /// <summary>
        /// Ẩn property Content của UserControl, không cho đối tượng bên ngoài thiết lập nó.
        /// </summary>
        public new UIElement Content
        {
            get { return base.Content; }
            protected set { base.Content = value; }
        }

        /// <summary>
        /// Lấy số lượng của image có trong Decoration.
        /// </summary>
        public int ImageCount
        {
            get { return _imageList.Count; }
        }
        #endregion

        #region //----------------------------- Private Event Handlers ------------------------------------//
        private void OnLoaded(object sender, RoutedEventArgs args)
        {
            foreach (Image image in root.Children)
            {
                _imageList.Add(image);
            }
        }
        #endregion

        #region //----------------------------- Class Public Methods --------------------------------------//
        /// <summary>
        /// Hiện ảnh có số thứ tự index. Các ảnh đã được hiện sẽ không bị ẩn đi.
        /// </summary>
        /// <param name="index">Số thứ tự của ảnh.</param>
        public void ShowImage(int index)
        {
            AssertIndex(index);
            _imageList[index].Opacity = 1;
        }

        /// <summary>
        /// Hiện ảnh có số thứ tự index. Các ảnh đã được hiện sẽ bị ẩn đi.
        /// </summary>
        /// <param name="index"></param>
        public void ShowOnlyImage(int index)
        {
            AssertIndex(index);
            foreach (Image image in _imageList)
            {
                image.Opacity = 0;
            }
            _imageList[index].Opacity = 1;
        }

        /// <summary>
        /// Ẩn ảnh có số thứ tự index. Các ảnh đã hiện còn lại không bị ảnh hưởng.
        /// </summary>
        /// <param name="index"></param>
        public void HideImage(int index)
        {
            AssertIndex(index);
            _imageList[index].Opacity = 0;
        }

        /// <summary>
        /// Ẩn tất cả các ảnh có trong BackgroundDecoration.
        /// </summary>
        public void HideAllImages()
        {
            foreach (Image img in _imageList)
            {
                img.Opacity = 0;
            }
        }
        #endregion

        #region //----------------------------- Class Private Methods -------------------------------------//
        /// <summary>
        /// Kiểm tra số thứ tự truyền vào của các phương thức ShowImage, ShowOnlyImage, HideImage, HideAllImages
        /// có chấp nhận được không.
        /// </summary>
        /// <param name="index">Số thứ tự cần kiểm tra.</param>
        private void AssertIndex(int index)
        {
            if (_imageList.Count == 0)
            {
                throw new InvalidOperationException("Không có ?nh nào trong Decoration.");
            }

            if (!(0 <= index && index < _imageList.Count))
            {
                throw new ArgumentOutOfRangeException("index");
            }
        }
        #endregion
    }
}
